import * as session from 'express-session';
import { Request } from 'express';
import helmet from 'helmet';
import { ValidationPipe, VersioningType } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { HttpFilter, ResponseInterceptor, WINSTON_LOGGER_TOKEN } from '@/common/index';
import { join } from 'path';
export const commonBootstrap = (app: any) => {
  // 获取配置模块
  const config = app.get(ConfigService);

  // 基于请求的Origin头部（表示发起请求的源），动态决定CORS策略
  const corsOptionsDelegate = (req: Request, callback: Function) => {
    let corsOptions: any;

    // 允许跨域访问的源地址
    const allowList = [
      'http://localhost',
      'http://localhost:8080',
      'http://localhost:4099'
    ];

    // 如果在，设置CORS选项corsOptions为包含请求的Origin和credentials: true的对象。credentials: true允许前端请求携带认证信息（如Cookies和HTTP认证信息）
    if (allowList.indexOf(req.header('Origin')) !== -1) {
      // 如果你不需要 Cookie 可以设置为 *
      // credentials 与前端的axios 的withCredentials（XMLHttpRequest.withCredentials）
      // 同时 origin必须设置为访问域 才能正常访问，主要是为了 凭证是 Cookie ，授权标头或 TLS 客户端证书
      corsOptions = { origin: req.header('Origin'), credentials: true };
    } else {
      // 通常表示禁用CORS
      corsOptions = { origin: false }; // disable CORS for this request
    }

    callback(null, corsOptions); // callback expects two parameters: error and options
  };

  // 版本控制
  app.enableVersioning({
    type: VersioningType.URI
  });

  // 增加全局前缀
  // app.setGlobalPrefix('api');

  // 常见Web 漏洞防护
  app.use(
    helmet({
      crossOriginOpenerPolicy: { policy: 'same-origin-allow-popups' },
      // 静态资源保护
      crossOriginResourcePolicy: false
    })
  );

  // 全局影响拦截
  app.useGlobalInterceptors(new ResponseInterceptor());

  // 全局异常处理
  app.useGlobalFilters(new HttpFilter());

  // 启动全局字段校验，保证请求接口字段校验正确。
  app.useGlobalPipes(new ValidationPipe());

  // session
  const sessionConfig = config.get('session');
  app.use(session(sessionConfig));

  // 启用跨域
  app.enableCors(corsOptionsDelegate);

   // useStaticAssets 配置静态访问目录
   app.useStaticAssets(join(__dirname, '../uploads'), {
    prefix: '/uploads' // prefix 虚拟前缀
    // maxAge: 1000 * 60 // 缓存时间
  });


  // 日志
  app.useLogger(app.get(WINSTON_LOGGER_TOKEN));
};
